package mysql

import (
	"crypto/md5"
	"encoding/hex"
	"errors"
	"go-0650-blog-grom/models"
	"go.uber.org/zap"
	"gorm.io/gorm"
)

const secret = "sswang.xqz"

type UserMapper struct {
}

/**
 * @Author SSWANG
 * @Description //TODO 对密码进行加密
 * @Date 22:00 2022/10/27
 **/
func encryptPassword(data []byte) (result string) {
	hash := md5.New()
	hash.Write([]byte(secret))
	return hex.EncodeToString(hash.Sum(data))
}

/**
 * @Author SSWANG
 * @Description //TODO 检查指定用户名的用户是否存在
 * @Date 21:50 2022/10/27
 **/
func (con UserMapper) CheckUserExist(username string) (err error) {
	var users []models.User
	Db.Where("username = ?", username).Find(&users)

	if len(users) != 0 {
		// 用户已存在
		return errors.New("用户已存在")
	}
	return
}

/**
 * @Author SSWANG
 * @Description //TODO 注册业务-向数据库中插入一条新的用户
 * @Date 21:53 2022/10/27
 **/
func (con UserMapper) InsertUser(user models.User) (err error) {
	// 对密码进行加密
	user.Password = encryptPassword([]byte(user.Password))

	// 执行SQL语句入库
	err = Db.Create(&user).Error

	if err != nil {
		zap.L().Error("insert user failed", zap.Error(err))
	}

	return
}

/**
 * @Author SSWANG
 * @Description //TODO 登录业务
 * @Date 14:41 2022/10/28
 **/
func Login(user *models.User) (err error) {
	originPassword := user.Password // 记录一下原始密码(用户登录的密码)

	var userF models.User
	err = Db.Where("username = ?", user.UserName).Find(&userF).Error

	if err != nil {
		// 查询数据库出错
		return ErrorUserNotExit
	}

	// 生成加密密码与查询到的密码比较
	password := encryptPassword([]byte(originPassword))
	if user.Password != password {
		return ErrorPasswordWrong
	}
	return
}

/**
 * @Author SSWANG
 * @Description //TODO 根据ID查询作者信息
 * @Date 19:50 2022/10/28
 **/
func GetUserByID(id uint64) (user *models.User, err error) {

	user = new(models.User) // 等价于 user = &models.User

	err = Db.Where("user_id = ?", id).Find(user).Error

	return
}

// 测试 Gorm 事务
func TestTransaction(user models.User) {

	Db.Transaction(func(tx *gorm.DB) error {
		// 在事务中执行一些 db 操作（从这里开始，您应该使用 'tx' 而不是 'db'）
		if err := tx.Create(&user).Error; err != nil {
			// 返回任何错误都会回滚事务
			return err
		}

		if err := tx.Create(&user).Error; err != nil {
			return err
		}

		// 返回 nil 提交事务
		return nil
	})
}